// router.js
import { RouterMount, createRouter } from 'uni-simple-router'
import { updateUserInfo } from '../utils/index'
import { getApiUserInfo } from '@/api/user'
import { saveOcUserRequestData } from '@/api/payTemplate'
import store from '../store'
import { getApiBalance } from '../api/user'

const router = createRouter({
  platform: process.env.VUE_APP_PLATFORM,
  routes: [...ROUTES],
})

//全局路由前置守卫
router.beforeEach(async (to, from, next) => {
  const eid = uni.getStorageSync('userInfo').eid
  const RequestData = uni.getLaunchOptionsSync() 

  // 如果从链接跳转进入播放页 :如果有携带渠道id就 储存渠道id/覆盖渠道id
  if ( to.query.channel_id) {
    uni.setStorageSync('channel_id', +RequestData.query.channel_id)
  }

  //  判断是否登录
  //1已经登录直接放行
  if (eid) {
    // 1.1有token和渠道id时回传信息 
    if ( to.query.channel_id) {
      setTimeout(async () => {
          const {
            data: { plan_id },
          } = await saveOcUserRequestData({
            eid,
            ...RequestData.query,
            scene: RequestData.scene,
          })
          uni.setStorageSync('plan_id', plan_id ? plan_id : 0)
          store.commit('user/setPlanID', plan_id ? plan_id : 0)
      }, 5000);
    } 
    next()
    return
  } else {
    // 2.没有登录调用login方法获取code码
    uni.login({
      provider: 'toutiao', //使用头条/抖音登录
      success: async (loginRes) => {
        // 2.1如果获取到code就调用后台的登录接口 获取用户数据id 
        if (loginRes.code) {
          // 调用封装的登录函数
          await login(loginRes , RequestData)
          next()
        }
      },
      fail: (err) => {
        // 如果登录失败则重新登录
        retryLogin()
      },
    })
  }
})
// 全局路由后置守卫
router.afterEach((to, from) => {})

/**
 *
 * @param {*} loginRes 微信登录接口成功后的响应数据
 * @param {*} RequestData  进入页面携带的数据
 */
const login = async (loginRes, RequestData) => {  
  //  后端登录接口
  const res = await getApiUserInfo(loginRes.code,loginRes.anonymousCode,RequestData.query.euid)
  // 2.3储存到仓库和本地
  store.commit('user/setuserInfo', res.data)
  // 获取用户余额
  const {
    data: { balance, give_balance ,vip_time},
  } = await getApiBalance(res.data.eid)
  
  const launchData = uni.getLaunchOptionsSync()
  console.log("🚀 ~ 登录信息logindata:", res)
  console.log("launchData", launchData)
  if(!launchData?.query.channel_id){
    store.commit('global/setIsHasChannelType', res?.data?.channel_type)
  }

  // 储存余额
  uni.setStorageSync('balance', {
    balance: balance ? balance : 0,
    give_balance: give_balance ? give_balance : 0,
    vip_time: vip_time ? vip_time : 0,
  })
  // 更新用户信息
  // await updateUserInfo()
  // 发送回传请求
  if ( RequestData.query.channel_id) {
   setTimeout(async () => {
     const {
       data: { plan_id },
     } = await saveOcUserRequestData({
       eid: res.data.eid,
       ...RequestData.query,
       scene: RequestData.scene,
     })
     uni.setStorageSync('plan_id', plan_id ? plan_id : 0)
     store.commit('user/setPlanID', plan_id ? plan_id : 0)
   }, 5000);
  }
}

// 重新登录
function retryLogin() {
  const RequestData = uni.getLaunchOptionsSync() 
  // 在此处执行重新登录的逻辑
  // 例如重新调用 uni.login() 方法
  uni.login({
    provider: 'toutiao',
    success: async (loginRes) => {
      // 重新登录成功后的处理逻辑
      if (loginRes.code) {
        await login(loginRes,RequestData)
        next()
      }
    },
    fail: (err) => {
      // 重新登录失败的处理逻辑
      // 可以根据具体需求进行处理，例如提示用户重新登录或执行其他操作
    },
  })
}

export { router, RouterMount }
